package com.im.service.utils;

import com.alibaba.fastjson.JSONObject;
import com.im.common.constant.Constants;
import com.im.common.enums.ImConnectStatusEnum;
import com.im.common.model.UserSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 用户会话工具类
 */
@Component
public class UserSessionUtils {

    // 自动注入 StringRedisTemplate 对象
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     * 获取用户的所有在线会话
     *
     * @param appId  应用 ID
     * @param userId 用户 ID
     * @return 用户的所有在线会话列表
     */
    public List<UserSession> getUserSession(Integer appId, String userId) {
        // 拼接 Redis key，格式为 appId:UserSession:userId
        String userSessionKey = appId + Constants.RedisConstants.UserSessionConstants + userId;
        // 获取 Redis 中该 key 对应的所有 hash 值
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(userSessionKey);
        // 遍历所有 hash 值，将在线会话加入列表中
        List<UserSession> list = new ArrayList<>();
        Collection<Object> values = entries.values();
        for (Object o : values) {
            String str = (String) o;
            UserSession session = JSONObject.parseObject(str, UserSession.class);
            if (session.getConnectState() == ImConnectStatusEnum.ONLINE_STATUS.getCode()) {
                list.add(session);
            }
        }
        return list;
    }

    /**
     * 获取指定客户端类型和 IMEI 的用户会话
     *
     * @param appId      应用 ID
     * @param userId     用户 ID
     * @param clientType 客户端类型
     * @param imei       设备 IMEI
     * @return 指定客户端类型和 IMEI 的用户会话
     */
    public UserSession getUserSession(Integer appId, String userId, Integer clientType, String imei) {
        // 拼接 Redis key，格式为 appId:UserSession:userId
        String userSessionKey = appId + Constants.RedisConstants.UserSessionConstants + userId;
        // 拼接 Redis hash key，格式为 clientType:imei
        String hashKey = clientType + ":" + imei;
        // 获取指定 hash key 对应的 hash 值，并将其转换为 UserSession 对象
        Object o = stringRedisTemplate.opsForHash().get(userSessionKey, hashKey);
        UserSession session = JSONObject.parseObject(o.toString(), UserSession.class);
        return session;
    }

}